package guiautorization;

import autorization.RegistrationFailed;
import gfdclient.ConnectWindow;
import gfdclient.InnerLogic;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import userservercontroller.IAutorizationClient;

/**
 *
 * @author Volk,Ustinov
 */
public class AutorizationWindow extends JDialog {
    InnerLogic logic;
    //----InputData---------------------------
      boolean isResult = false; //Признак в котором сохраняется результат процесса авторизации
      String login = null; //логин с которым прошла авторизация
      String password = null; //пароль с которым прошла авторизация
      boolean isAnotherComputer = false; //состояние флага "Чужой коспьютер"
      boolean isSavePassword = false; //Состояние флага "Сохранить пароль"
      ConnectWindow wnd = new ConnectWindow(this); //Окно сетевого соединения
	  long key = -1; // Значение овторизации.
	  Thread t = null; // Поток для подключения.
    //----------------------------------------

    /** Creates new form AutorizationWindow */
    public AutorizationWindow(JFrame owner, InnerLogic logic) {
        super(owner, "Авторизация пользователя в системе", true);
        this.logic = logic;
        initComponents();
        setLocation();
        setResizable(false);
        configElement();
    }

    //----------Inner methood------------------------------


    //-----------Рассчитать позицию окна авторизации на экране----------
    private void setLocation(){
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension dm = tk.getScreenSize();
        int xPos = dm.width/2 - getWidth()/2;
        int yPos = dm.height/2 - getHeight()/2;
        setLocation(xPos,yPos);
    }

    //----------Проверка вводимых в форму данных , what может принять значение "Пароль" или "Логин"
    private boolean check(String str, String what){
      if(str == null || str.equals("")){
        editMsg.setText("Ошибка: " + what + " пуст" );
        return false;
      }

      StringBuilder builder = new StringBuilder(str);
      boolean isFirstCharacter = true;
      for(int i = 0; i < builder.length(); i++){
        char currentChar = builder.charAt(i);
        if( !Character.isLetter(currentChar) && !Character.isDigit(currentChar) && (currentChar != '-') && (currentChar != '_') ){
          editMsg.setText("Ошибка: " + what + " может состоять только из символов латинского языка, кириллицы,цифр, символов _ или -");
          return false;
        }

        if(isFirstCharacter){
          isFirstCharacter = false;
          if(Character.isDigit(currentChar) || (currentChar == '-') ){
           editMsg.setText("Ошибка: " + what + " не может начиначаться с символа - или цифры");
           return false;
          }
        }
      }
      return true;
    }

    //----------Выставить конфигурацию элементов управления---------------------------------------
    private void configElement(){
      editMsg.setAutoscrolls(true);
      editMsg.setEditable(false);

      labelLogin.setIcon(new ImageIcon("pict/login_16.png"));
      labelPassword.setIcon(new ImageIcon("pict/pwd_16.png"));
      labelRegistration.setIcon(new ImageIcon("pict/login_16.png"));
      butConnect.setIcon(new ImageIcon("pict/connect_16.png"));

      butConnect.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event) {
          wnd.setVisible(true);
        }
      });

        checkAnotherComputer.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (checkAnotherComputer.isSelected())
                    checkSavePassword.setEnabled(false);
                else
                    checkSavePassword.setEnabled(true);
            }
        });

    }
    //-----------------------------------------------------

    //-----------Class get-methood-----------------------------------------

    /**
     * Получить результат авторизации---
     * @return true - в случае успешной авторизации false - в случай ошибки авторизации
     */
    public boolean getResult(){
     return isResult;
    }


    /**
     * Получить логин, с которым прошла авторизация
     * @return логин
     */
    public String getLogin(){
     return login;
    }

    /**
     * Получить пароль, с которым прошла авторизация
     * @return пароль
     */
    public String getPassword(){
     return password;
    }

    /**
     * Получить признак, был ли установлен флаг "Чужой компьюетр"
     * @return true - признак установле, false - признак не установлен
     */
    public boolean getIsAnotherComputer(){
     return isAnotherComputer;
    }

    /**
     * Получить признак, был ли установлен флаг "Сохранить пароль на этом компьютере"
     * @return true - признак установле, false - признак не установлен
     */
    public boolean getIsSavePassword(){
     return isSavePassword;
    }

    /**
     * Получить адрес сервера к которому прошло соединение
     * @return Адрес сервера
     */
    public String getInetAddress(){
     return wnd.getAddress();
    }
    //---------------------------------------------------------------------

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        UserPanel = new javax.swing.JPanel();
        labelLogin = new javax.swing.JLabel();
        labelPassword = new javax.swing.JLabel();
        editPassword = new javax.swing.JPasswordField();
        comboLogin = new javax.swing.JComboBox();
        panelParametres = new javax.swing.JPanel();
        checkAnotherComputer = new javax.swing.JCheckBox();
        checkSavePassword = new javax.swing.JCheckBox();
        buttonAutorization = new javax.swing.JButton();
        labelRegistration = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        editMsg = new javax.swing.JTextArea();
        butConnect = new javax.swing.JButton();

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        UserPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createTitledBorder(""), "Персональная информация", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP));

        labelLogin.setText("Логин:");
        labelLogin.setToolTipText("Логин - персональное имя вашей учетной записи, под которым вы можете войти в систему");

        labelPassword.setText("Пароль:");
        labelPassword.setToolTipText("Пароль - последовательность символов, которая необходима для подтверждения вашей личности. В данной поле необходимо ввести пароль, который вы указывали при регистрации вашей учётной записи");

        editPassword.setToolTipText("Поле для ввода пароля");

        comboLogin.setEditable(true);
        comboLogin.setToolTipText("Поле для ввода логина");

        javax.swing.GroupLayout UserPanelLayout = new javax.swing.GroupLayout(UserPanel);
        UserPanel.setLayout(UserPanelLayout);
        UserPanelLayout.setHorizontalGroup(
            UserPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(UserPanelLayout.createSequentialGroup()
                .addGap(64, 64, 64)
                .addGroup(UserPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelLogin, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(labelPassword))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(UserPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(editPassword, javax.swing.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE)
                    .addComponent(comboLogin, 0, 196, Short.MAX_VALUE))
                .addContainerGap())
        );
        UserPanelLayout.setVerticalGroup(
            UserPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(UserPanelLayout.createSequentialGroup()
                .addGroup(UserPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelLogin)
                    .addComponent(comboLogin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(UserPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelPassword)
                    .addComponent(editPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        panelParametres.setBorder(javax.swing.BorderFactory.createTitledBorder("Дополнительные параметры"));
        panelParametres.setToolTipText("Дополнительные параметры - набор элементов для более детальной настройки процесса авторизации");

        checkAnotherComputer.setText("Чужой компьютер");
        checkAnotherComputer.setToolTipText("Режим \"Чужой компьютер\" - режм при котором информация о ваших персональных данных не будет сохранена или в каком то виде зафиксирована при работа на данном компьютере");

        checkSavePassword.setText("Сохранить пароль на этом компьютере");
        checkSavePassword.setToolTipText("Позволить системе сохранить ваш персональный пароль на данном компьютере. При повторной авторизации пароль будет введён автоматически.");

        javax.swing.GroupLayout panelParametresLayout = new javax.swing.GroupLayout(panelParametres);
        panelParametres.setLayout(panelParametresLayout);
        panelParametresLayout.setHorizontalGroup(
            panelParametresLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelParametresLayout.createSequentialGroup()
                .addGap(27, 27, 27)
                .addGroup(panelParametresLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(checkSavePassword)
                    .addComponent(checkAnotherComputer))
                .addContainerGap(105, Short.MAX_VALUE))
        );
        panelParametresLayout.setVerticalGroup(
            panelParametresLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelParametresLayout.createSequentialGroup()
                .addComponent(checkAnotherComputer)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(checkSavePassword))
        );

        buttonAutorization.setText("Авторизация");
        buttonAutorization.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonAutorizationActionPerformed(evt);
            }
        });

        labelRegistration.setFont(new java.awt.Font("Comic Sans MS", 2, 11));
        labelRegistration.setForeground(new java.awt.Color(0, 0, 255));
        labelRegistration.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        labelRegistration.setText("Зарегистрировать новую учётную запись?");
        labelRegistration.setToolTipText("Кликните по этой надписи для перехода в окно регистрации.");
        labelRegistration.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                labelRegistrationMouseClicked(evt);
            }
        });

        editMsg.setBackground(new java.awt.Color(229, 189, 0));
        editMsg.setColumns(20);
        editMsg.setEditable(false);
        editMsg.setLineWrap(true);
        editMsg.setRows(5);
        editMsg.setText("Введите параметры необходимые для авториазции");
        editMsg.setToolTipText("Сообщений журнала предоставят вам более детальную информацию о процессе авторизации, - обращайте на него внимание!");
        jScrollPane2.setViewportView(editMsg);

        butConnect.setToolTipText("Если у вас проблемы с подключением, то вы можете просмотреть и при необходимости изменить настройки подключения");
        butConnect.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                butConnectActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelParametres, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(UserPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                            .addComponent(butConnect, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(18, 18, 18)
                            .addComponent(buttonAutorization, javax.swing.GroupLayout.PREFERRED_SIZE, 292, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(labelRegistration, javax.swing.GroupLayout.PREFERRED_SIZE, 322, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
            .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 395, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(UserPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelParametres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(labelRegistration, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(butConnect, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(buttonAutorization, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void buttonAutorizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAutorizationActionPerformed


		if(key == -1)
		{
			isResult = false; //Писсимистично считаем что авторизация провалилась

		   //---------Проверка валидации логина и пароля-------------
		   login = (String)comboLogin.getSelectedItem();
		   if(!check(login, "Логин")) return;

		   password = new String(editPassword.getPassword());
		   if(!check(password, "Пароль"))return;
		   //---------------------------------------------------------

		   //-----Получаем значение флагов Чужой компьютер и Сохранить пароль
		   isAnotherComputer = checkAnotherComputer.isSelected();
		   isSavePassword = checkSavePassword.isSelected();

			// Изменение от <21.03.2009> Автор <TrueWar, id=2009> Суть:
			// Создание отдельного потока для соединения.
			t = new Thread()
			{
				@Override
				public void run()
				{
					try
					{
						connect();
					} catch(InterruptedException e)
					{
						interrupt();
					}
				}

				public void connect() throws InterruptedException
				{
					key = 1;
					AutorizationWindow.this.buttonAutorization.setText("Отменить авторизацию.");
					AutorizationWindow.this.comboLogin.				setEnabled(false);
					AutorizationWindow.this.editPassword.			setEnabled(false);
					AutorizationWindow.this.butConnect.				setEnabled(false);
					AutorizationWindow.this.checkAnotherComputer.	setEnabled(false);
					AutorizationWindow.this.checkSavePassword.		setEnabled(false);
					/** Задержка соединения <!TODO> Убить строку. */
					//try{Thread.sleep(2000);} catch(InterruptedException e){Thread.currentThread().interrupt();}
					 if (Thread.interrupted() == true)
						throw new InterruptedException();
					try
					{
						logic.connectServer(wnd.getAddress());
						key = logic.autorization(login, password);
					}catch(Exception e)
					{
						key = 3;
					}
					checkAuthResult();
				}
			};
			t.start();
			try{Thread.sleep(10);} catch(InterruptedException e){Thread.currentThread().interrupt();}
			checkAuthResult();
		} else
		if(key == 1)
		{
			t.interrupt();
			t = null;
			key = 2;
			checkAuthResult();
		}
    }//GEN-LAST:event_buttonAutorizationActionPerformed

	/**
	 * Установка сообщения о результате соединения.
	 */
	private void checkAuthResult()
	{
		if(key==-1){
			editMsg.setText("Авторизация на сервере завершилась неудачей" );
		}
		if(key == -2){
			editMsg.setText("Пользователь с таким логином и паролем уже авторизован в сети" );
		}
		if(key == 1){
			editMsg.setText("Установка соединения" );
			return;
		}
		if(key == 2){
			editMsg.setText("Соединение отменено пользователем" );
		}
		if(key == 3){
			editMsg.setText("Сервер не найден");
		}
		AutorizationWindow.this.buttonAutorization.setText("Авторизация.");
		AutorizationWindow.this.comboLogin.				setEnabled(true);
		AutorizationWindow.this.editPassword.			setEnabled(true);
		AutorizationWindow.this.butConnect.				setEnabled(true);
		AutorizationWindow.this.checkAnotherComputer.	setEnabled(true);
		AutorizationWindow.this.checkSavePassword.		setEnabled(true);
		if(key == 0) // Сокрытие форм только при удачном соединении.
		{
			isResult = true;
			setVisible(false);
			key=-1; // Сброс в начальное состояние.
			return;
		}
		key=-1; // Сброс в начальное состояние.
		isResult = false;
	}
    //Вызов окна регистрации
    private void labelRegistrationMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelRegistrationMouseClicked
      RegistrationWindow rw = new RegistrationWindow(this, logic);
      rw.setVisible(true);
      if(rw.getResult()){
        comboLogin.setSelectedItem(rw.getLogin());
        editPassword.setText(rw.getPassword());
        checkAnotherComputer.setSelected(rw.getIsAnotherComputer());
        checkSavePassword.setSelected(rw.getIsSavePassword());
        wnd.setInetAddress(rw.getInetAddress());

      }
    }//GEN-LAST:event_labelRegistrationMouseClicked

    private void butConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_butConnectActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_butConnectActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel UserPanel;
    private javax.swing.JButton butConnect;
    private javax.swing.JButton buttonAutorization;
    private javax.swing.JCheckBox checkAnotherComputer;
    private javax.swing.JCheckBox checkSavePassword;
    private javax.swing.JComboBox comboLogin;
    private javax.swing.JTextArea editMsg;
    private javax.swing.JPasswordField editPassword;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JLabel labelLogin;
    private javax.swing.JLabel labelPassword;
    private javax.swing.JLabel labelRegistration;
    private javax.swing.JPanel panelParametres;
    // End of variables declaration//GEN-END:variables

}
